#ifndef MEASURE_H
#define MEASURE_H

#ifdef __cplusplus
extern "C" {
#endif

#include "vdsdef.h"
#include <stdlib.h>        
#include <stdio.h>

#if defined(WIN32) && !defined(__MINGW32__)
#define MEASURE_IMPORT __declspec(dllimport)
#define MEASURE_EXPORT __declspec(dllexport)
#else
#define MEASURE_IMPORT
#ifdef GCC_HASCLASSVISIBILITY
#define MEASURE_EXPORT __attribute__ ((visibility("default")))
#else
#define MEASURE_EXPORT
#endif
#endif

#ifdef MEASURE_INTERNAL
#define MEASURE_API MEASURE_EXPORT
#else
#define MEASURE_API MEASURE_IMPORT
#endif 
    
#define OVERFLOWVALUE   (99*1e35)
#define OVERFLOWTIME    (99*1e35)

    typedef struct {
        F64 max; //最大值
        F64 min; //最小值
        F64 pk_pk; //峰峰值
        F64 Vtop; //顶端值
        F64 Vbase; //底端值
        F64 Vamp; //幅度值
        F64 VoverShoot; //过冲
        F64 VpreShoot; //预冲
        F64 average; //平均值
        F64 Vrms; //均方根值
        F64 cycleRMS; //周期均方根值

        F64 period; //周期
        F64 freq; //频率
        F64 riseTime; //上升时间
        F64 fallTime; //下降时间
        F64 PWidth; //正脉宽
        F64 NWidth; //负脉宽
        F64 PDuty; // 正占空比
        F64 NDuty; // 负占空比

        F64 area; //面积
        F64 cycleArea; //周期面积

        S32 PPulseNum; //正脉冲个数
        S32 NPulseNum; //负脉冲个数
        S32 risingEdgeNum; //上升边沿个数
        S32 fallingEdgeNum; //下降边沿个数

        S32 overflow; //数据溢出标志1:溢出,0:无溢出

        F64 pauseRMS; //脉冲均方根值
    } MeasureItemResult;

    typedef struct {
        F64 delayRR[CH_TOTAL][CH_TOTAL]; // 通道间参数: 上升沿延迟: 从信号源 1 的第一个上升沿位置开始，搜索到信号源 2 的首个上升沿之间的时间.
        F64 delayFF[CH_TOTAL][CH_TOTAL]; // 通道间参数: 下降沿延迟: 从信号源 1 的第一个下降沿位置开始，搜索到信号源 2 的首个下降沿之间的时间.

        F64 phaseRR[CH_TOTAL][CH_TOTAL]; // 通道间参数: 上升沿相位
        F64 phaseFF[CH_TOTAL][CH_TOTAL]; // 通道间参数: 下降沿相位	

        F64 FRR[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个上升沿与信号源 2 的第一个上升沿之间的时间.
        F64 FRF[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个上升沿与信号源 2 的第一个下降沿之间的时间.
        F64 FFR[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个下降沿与信号源 2 的第一个上升沿之间的时间.
        F64 FFF[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个下降沿与信号源 2 的第一个下降沿之间的时间.
        F64 LRR[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个上升沿与信号源 2 的最后一个上升沿之间的时间.
        F64 LRF[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个上升沿与信号源 2 的最后一个下降沿之间的时间.
        F64 LFR[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个下降沿与信号源 2 的最后一个上升沿之间的时间.
        F64 LFF[CH_TOTAL][CH_TOTAL]; // 信号源 1 的第一个下降沿与信号源 2 的最后一个下降沿之间的时间.	
    } MeasureDelayResult;

    typedef struct {
        MeasureItemResult measItem[CH_TOTAL];
        MeasureDelayResult measDelay;
    } MeasureResult;

    MEASURE_API BOOL vds6000Measure(U8 *data, S32 size, MeasureResult *result);

#ifdef __cplusplus
}
#endif

#endif /* MEASURE_H */

